package models

import (
	"time"

	"github.com/google/uuid"
)

// DatabaseType 数据库类型枚举
type DatabaseType string

const (
	Oracle     DatabaseType = "oracle"
	MySQL      DatabaseType = "mysql"
	PostgreSQL DatabaseType = "postgresql"
	SQLite     DatabaseType = "sqlite"
	SQLServer  DatabaseType = "sqlserver"
	Redis      DatabaseType = "redis"
	DaMeng     DatabaseType = "dameng" // 添加达梦数据库类型
)

// DatabaseConfig 数据库连接配置
type DatabaseConfig struct {
	ID         string       `json:"id" gorm:"primaryKey"`
	Name       string       `json:"name" gorm:"not null"`             // 连接名称
	Type       DatabaseType `json:"type" gorm:"not null"`             // 数据库类型
	Host       string       `json:"host"`                             // 主机地址
	Port       int          `json:"port"`                             // 端口
	Username   string       `json:"username"`                         // 用户名
	Password   string       `json:"password"`                         // 密码（加密存储）
	Database   string       `json:"database"`                         // 数据库名
	SSLMode    string       `json:"ssl_mode,omitempty"`               // SSL模式
	Charset    string       `json:"charset,omitempty"`                // 字符集
	Timezone   string       `json:"timezone,omitempty"`               // 时区
	FilePath   string       `json:"file_path,omitempty"`              // SQLite文件路径
	Options    string       `json:"options,omitempty"`                // 额外连接参数
	IsDefault  bool         `json:"is_default" gorm:"default:false"`  // 是否为默认连接
	CreatedAt  time.Time    `json:"created_at" gorm:"autoCreateTime"` // 创建时间
	UpdatedAt  time.Time    `json:"updated_at" gorm:"autoUpdateTime"` // 更新时间
	LastUsedAt *time.Time   `json:"last_used_at,omitempty"`           // 最后使用时间
}

// TableInfo 表信息
type TableInfo struct {
	Name        string `json:"name"`         // 表名
	Schema      string `json:"schema"`       // 模式名
	Type        string `json:"type"`         // 表类型 (TABLE, VIEW, etc.)
	Engine      string `json:"engine"`       // 存储引擎
	Collation   string `json:"collation"`    // 排序规则
	RowCount    int64  `json:"row_count"`    // 行数
	DataLength  int64  `json:"data_length"`  // 数据大小
	IndexLength int64  `json:"index_length"` // 索引大小
	Comment     string `json:"comment"`      // 注释
	CreatedAt   string `json:"created_at"`   // 创建时间
}

// ColumnInfo 列信息
type ColumnInfo struct {
	Name            string                 `json:"name"`
	Type            string                 `json:"type"`
	FullType        string                 `json:"fullType"`
	Length          int                    `json:"length"`
	LengthDisplay   string                 `json:"lengthDisplay"`  // 格式化后的显示长度值
	SemanticType    string                 `json:"semanticType"`   // 字节/字符语义类型(BYTE/CHAR)
	OriginalLength  int64                  `json:"originalLength"` // 原始长度值
	BytesPerChar    int                    `json:"bytesPerChar"`   // 每字符字节数
	Precision       int                    `json:"precision"`
	Scale           int                    `json:"scale"`
	IsNullable      bool                   `json:"isNullable"`
	NotNull         bool                   `json:"notNull"`
	IsPrimaryKey    bool                   `json:"isPrimaryKey"`
	PrimaryKey      bool                   `json:"primaryKey"`
	IsAutoIncrement bool                   `json:"isAutoIncrement"`
	AutoIncrement   bool                   `json:"autoIncrement"`
	Position        int                    `json:"position"`
	DefaultValue    string                 `json:"defaultValue"`
	Comment         string                 `json:"comment"`
	Charset         string                 `json:"charset"`
	Collation       string                 `json:"collation"`
	Extra           string                 `json:"extra"`
	Values          []string               `json:"values"`
	RawInfo         map[string]interface{} `json:"rawInfo"`
}

// IndexInfo 索引信息
type IndexInfo struct {
	Name      string   `json:"name"`       // 索引名
	Type      string   `json:"type"`       // 索引类型
	IsUnique  bool     `json:"is_unique"`  // 是否唯一
	IsPrimary bool     `json:"is_primary"` // 是否主键
	Columns   []string `json:"columns"`    // 包含的列
	Comment   string   `json:"comment"`    // 注释
}

// DatabaseInfo 数据库信息
type DatabaseInfo struct {
	Name      string `json:"name"`      // 数据库名
	Charset   string `json:"charset"`   // 字符集
	Collation string `json:"collation"` // 排序规则
	Size      int64  `json:"size"`      // 大小
	Comment   string `json:"comment"`   // 注释
}

// QueryResult 查询结果
type QueryResult struct {
	Columns      []string                 `json:"columns"`         // 列名
	Rows         []map[string]interface{} `json:"rows"`            // 数据行
	RowCount     int                      `json:"row_count"`       // 行数
	AffectedRows int64                    `json:"affected_rows"`   // 影响行数
	ExecuteTime  time.Duration            `json:"execute_time"`    // 执行时间
	Error        string                   `json:"error,omitempty"` // 错误信息
}

// ConnectionStatus 连接状态
type ConnectionStatus struct {
	ConfigID    string    `json:"config_id"`       // 配置ID
	IsConnected bool      `json:"is_connected"`    // 是否连接
	Error       string    `json:"error,omitempty"` // 错误信息
	ConnectedAt time.Time `json:"connected_at"`    // 连接时间
	Version     string    `json:"version"`         // 数据库版本
}

// BeforeCreate 创建前钩子，生成UUID
func (dc *DatabaseConfig) BeforeCreate() error {
	if dc.ID == "" {
		dc.ID = uuid.New().String()
	}
	return nil
}

// GetConnectionString 获取连接字符串
func (dc *DatabaseConfig) GetConnectionString() string {
	switch dc.Type {
	case MySQL:
		dsn := dc.Username + ":" + dc.Password + "@tcp(" + dc.Host + ":" + string(rune(dc.Port)) + ")/" + dc.Database
		if dc.Charset != "" {
			dsn += "?charset=" + dc.Charset
		}
		if dc.Options != "" {
			if dc.Charset != "" {
				dsn += "&" + dc.Options
			} else {
				dsn += "?" + dc.Options
			}
		}
		return dsn
	case PostgreSQL:
		dsn := "host=" + dc.Host + " port=" + string(rune(dc.Port)) + " user=" + dc.Username + " password=" + dc.Password + " dbname=" + dc.Database
		if dc.SSLMode != "" {
			dsn += " sslmode=" + dc.SSLMode
		}
		if dc.Timezone != "" {
			dsn += " TimeZone=" + dc.Timezone
		}
		return dsn
	case SQLite:
		return dc.FilePath
	case SQLServer:
		return "server=" + dc.Host + ";port=" + string(rune(dc.Port)) + ";database=" + dc.Database + ";user id=" + dc.Username + ";password=" + dc.Password
	default:
		return ""
	}
}

// TableSchema 表结构定义（用于创建表）
type TableSchema struct {
	Name            string                 `json:"name"`            // 表名
	Schema          string                 `json:"schema"`          // 模式名（PostgreSQL、SQL Server等）
	Comment         string                 `json:"comment"`         // 表注释
	Engine          string                 `json:"engine"`          // 存储引擎（MySQL）
	Charset         string                 `json:"charset"`         // 字符集
	Collation       string                 `json:"collation"`       // 排序规则
	Columns         []ColumnSchema         `json:"columns"`         // 列定义
	Indexes         []IndexSchema          `json:"indexes"`         // 索引定义
	ForeignKeys     []ForeignKeySchema     `json:"foreignKeys"`     // 外键定义
	AdvancedOptions map[string]interface{} `json:"advancedOptions"` // 高级选项
}

// ColumnSchema 列结构定义
type ColumnSchema struct {
	Name          string   `json:"name"`          // 列名
	Type          string   `json:"type"`          // 数据类型
	Length        int      `json:"length"`        // 长度
	Precision     int      `json:"precision"`     // 精度
	Scale         int      `json:"scale"`         // 小数位数
	NotNull       bool     `json:"notNull"`       // 是否非空
	PrimaryKey    bool     `json:"primaryKey"`    // 是否主键
	AutoIncrement bool     `json:"autoIncrement"` // 是否自增
	DefaultValue  string   `json:"defaultValue"`  // 默认值
	Comment       string   `json:"comment"`       // 列注释
	Charset       string   `json:"charset"`       // 字符集（仅字符类型）
	Collation     string   `json:"collation"`     // 排序规则（仅字符类型）
	Values        []string `json:"values"`        // 枚举值（ENUM/SET类型）
	Extra         string   `json:"extra"`         // 额外属性
}

// IndexSchema 索引结构定义
type IndexSchema struct {
	Name    string   `json:"name"`    // 索引名
	Type    string   `json:"type"`    // 索引类型（BTREE、HASH、UNIQUE等）
	Columns []string `json:"columns"` // 索引列
	Comment string   `json:"comment"` // 索引注释
}

// ForeignKeySchema 外键结构定义
type ForeignKeySchema struct {
	Name             string   `json:"name"`             // 外键名
	Columns          []string `json:"columns"`          // 本表列
	ReferenceTable   string   `json:"referenceTable"`   // 引用表
	ReferenceColumns []string `json:"referenceColumns"` // 引用列
	UpdateRule       string   `json:"updateRule"`       // 更新规则（CASCADE、RESTRICT等）
	DeleteRule       string   `json:"deleteRule"`       // 删除规则
}

// TableAlterSchema 表修改结构定义
type TableAlterSchema struct {
	// 列操作
	AddColumns    []ColumnSchema    `json:"addColumns"`    // 新增列
	ModifyColumns []ColumnSchema    `json:"modifyColumns"` // 修改列
	DropColumns   []string          `json:"dropColumns"`   // 删除列
	RenameColumns map[string]string `json:"renameColumns"` // 重命名列（旧名->新名）

	// 索引操作
	AddIndexes  []IndexSchema `json:"addIndexes"`  // 新增索引
	DropIndexes []string      `json:"dropIndexes"` // 删除索引

	// 外键操作
	AddForeignKeys  []ForeignKeySchema `json:"addForeignKeys"`  // 新增外键
	DropForeignKeys []string           `json:"dropForeignKeys"` // 删除外键

	// 表级选项修改
	Engine    string `json:"engine"`    // 修改存储引擎
	Charset   string `json:"charset"`   // 修改字符集
	Collation string `json:"collation"` // 修改排序规则
	Comment   string `json:"comment"`   // 修改表注释
}

// BatchExecuteResult 批量执行SQL的结果
type BatchExecuteResult struct {
	TotalStatements       int               `json:"totalStatements"`       // 总语句数
	SuccessCount          int               `json:"successCount"`          // 成功数量
	FailedCount           int               `json:"failedCount"`           // 失败数量
	Results               []StatementResult `json:"results"`               // 每条语句的执行结果
	TotalExecuteTime      time.Duration     `json:"totalExecuteTime"`      // 总执行时间
	StartTime             time.Time         `json:"startTime"`             // 开始时间
	StoppedOnError        bool              `json:"stoppedOnError"`        // 是否因错误停止
	TransactionCommitted  bool              `json:"transactionCommitted"`  // 事务是否已提交
	TransactionRolledBack bool              `json:"transactionRolledBack"` // 事务是否已回滚
}

// StatementResult 单条SQL语句的执行结果
type StatementResult struct {
	Index        int           `json:"index"`        // 语句索引
	SQL          string        `json:"sql"`          // SQL语句
	Success      bool          `json:"success"`      // 是否成功
	Error        string        `json:"error"`        // 错误信息
	AffectedRows int64         `json:"affectedRows"` // 影响的行数（非查询语句）
	RowCount     int           `json:"rowCount"`     // 返回的行数（查询语句）
	ExecuteTime  time.Duration `json:"executeTime"`  // 执行时间
	StartTime    time.Time     `json:"startTime"`    // 开始时间
	QueryResult  *QueryResult  `json:"queryResult"`  // 查询结果（仅查询语句）
}
